package com.moonciki.multids.multi;

import com.alibaba.ttl.TransmittableThreadLocal;
import com.moonciki.multids.properties.MultiDataSourceProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class DynamicDataSourceContextHolder {

    /** ds前缀 **/
    private volatile static String namePrefix;

    /*
     * 当使用ThreadLocal维护变量时，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     * 所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     * 使用 ali 的 TTL 确保异步线程时，threadLocal 正常传递
     */
    private static final ThreadLocal<String> contextHolder = new TransmittableThreadLocal<>();

    /*
     * 管理所有的数据源id;
     * 主要是为了判断数据源是否存在;
     */
    public static List<String> dataSourceSet = new ArrayList<String>();

    /**
     * 使用setDataSourceType设置当前的
     *
     * @param dataSourceType
     */
    public static void setDataSourceType(String dataSourceType) {

        contextHolder.set(dataSourceType);

    }

    public static String getDataSourceType() {
        return contextHolder.get();
    }

    public static void clearDataSourceType() {
        contextHolder.remove();
    }

    /**
     * 设置默认数据源
     */
    public static void setDefaultDataSource() {
        contextHolder.remove();
    }

    /**
     * 判断指定DataSrouce当前是否存在
     *
     * @param dataSourceId
     * @return
     * @author SHANHY
     * @create 2016年1月24日
     */
    public static boolean containsDataSource(String dataSourceId) {

        return dataSourceSet.contains(dataSourceId);

    }

    /**
     * 动态数据源key
     * @param dbName
     * @return
     */
    public static String getDataSourceKey(String dbName){
        if(StringUtils.isBlank(namePrefix)){
            throw new NullPointerException("namePrefix is null!");
        }

        String dsKey = namePrefix + dbName;

        return dsKey;
    }

    public static void setNamePrefix(String reqNamePrefix){
        if(StringUtils.isBlank(namePrefix)){
            namePrefix = reqNamePrefix;
        }else {
            log.warn(" --- namePrefix has bean inited !!");
        }
    }

}
